package com.study.springbootsecurity.config.statemachine;

import com.study.springbootsecurity.enums.QrCodeStatuesChangeEventType;
import com.study.springbootsecurity.enums.QrCodeStatus;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.config.EnableStateMachine;
// StateMachineConfigurerAdapter状态机适配器类 添加 状态枚举 状态变更事件枚举类
import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;

import java.util.EnumSet;

/**
 * @Description: TODO 二维码状态机配置类
 * @author: Huangjianyun
 * @date: 2025-06-21 15:43
 */
@Configuration
@EnableStateMachine(name = "qrcodeStateMachine")
public class QrCodeStateMachineConfig extends StateMachineConfigurerAdapter<QrCodeStatus, QrCodeStatuesChangeEventType> {

    /**
     * 配置状态及状态
     * @param states 二维码状态
     * @throws Exception
     */
    @Override
    public void configure(StateMachineStateConfigurer<QrCodeStatus, QrCodeStatuesChangeEventType> states) throws Exception {
        states
                .withStates()
                .initial(QrCodeStatus.WAITING_SCAN )       // 初始化状态机： 初始状态为二维码新建待扫码状态
                .states(EnumSet.allOf(QrCodeStatus.class)) //设置所有二维码状态可能状态
                .end(QrCodeStatus.CONFIRMED)  // 登录成功状态 无状态变更和事件 终结状态
                .end(QrCodeStatus.CANCELED)   // 取消登录状态 无状态变更和事件 终结状态
                .end(QrCodeStatus.EXPIRED);   // 过期状态 无状态变更和事件 终结状态
    }


    /**
     * 配置状态转换事件关系
     * @param transitions
     * @throws Exception
     */
    @Override
    public void configure(StateMachineTransitionConfigurer<QrCodeStatus, QrCodeStatuesChangeEventType> transitions) throws Exception {
            transitions.withExternal()
                    .source(QrCodeStatus.WAITING_SCAN )           // 二维码生成待扫码状态
                    .target(QrCodeStatus.SCANNED_WAITING_CONFIRM) // 二维码生成待确认扫码
                    .event(QrCodeStatuesChangeEventType.QR_CODE_SCANNED_EVENT)  // 二维码扫码事件
                    .and()
                    .withExternal()
                    .source(QrCodeStatus.WAITING_SCAN)          // 二维码生成待扫码状态
                    .target(QrCodeStatus.EXPIRED)               // 二维码过期状态
                    .event(QrCodeStatuesChangeEventType.EXPIRED_EVENT)          // 二维码过期事件
                    .and()
                    .withExternal()
                    .source(QrCodeStatus.SCANNED_WAITING_CONFIRM) //二维码扫码后 待确认登录事件(两层含义：1-待确认登录;2-待确认取消登录事件)
                    .target(QrCodeStatus.CONFIRMED)               //二维码确认登录状态
                    .event(QrCodeStatuesChangeEventType.USER_CONFIRMED_EVENT)  //二维码确认授权事件
                    .and()
                    .withExternal()
                    .source(QrCodeStatus.SCANNED_WAITING_CONFIRM) //二维码扫码 待确认取消授权状态
                    .target(QrCodeStatus.CANCELED)                //二维码扫码 取消授权状态
                    .event(QrCodeStatuesChangeEventType.USER_CANCELED_EVENT); //取消授权事件
    }

}
